package cn.ustb.controller;

import cn.ustb.config.AlipayConfig;
import com.alipay.api.internal.util.AlipaySignature;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;

/**
 * @author ljy
 */
@WebServlet(name = "OrderPayServlet", value = "/payresult")
public class PayresultServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("payresult=============");
        try {
            /*
             * * 功能：支付宝服务器同步通知页面 日期：2017-03-30 说明：
             * 以下代码只是为了方便商户测试而提供的样例代码，商户可以根据自己网站的需要，按照技术文档编写,并非一定要使用该代码。
             * 该代码仅供学习和研究支付宝接口使用，只是提供一个参考。 页面功能说明*************************
             * 该页面仅做页面展示，业务逻辑处理请勿在该页面执行
             */
            // 获取支付宝GET过来反馈信息
            Map<String, String> params = new HashMap<>();
            Map<String, String[]> requestParams = request.getParameterMap();
            for (String name : requestParams.keySet()) {
                String[] values = requestParams.get(name);
                String valueStr = "";
                for (int i = 0; i < values.length; i++) {
                    valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ",";
                }
                // 乱码解决，这段代码在出现乱码时使用
                valueStr = new String(valueStr.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
                params.put(name, valueStr);
            }
            // 验签 调用SDK验证签名
            boolean signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.ALIPAY_PUBLIC_KEY,
                    AlipayConfig.CHARSET, AlipayConfig.SIGNTYPE);
            // ——请在这里编写您的程序（以下代码仅作参考）——
            if (signVerified) {
                // 商户订单号
                String out_trade_no = new String(
                        request.getParameter("out_trade_no").getBytes(StandardCharsets.ISO_8859_1)
                        , StandardCharsets.UTF_8);
                // 支付宝交易号
                String trade_no = new String(
                        request.getParameter("trade_no").getBytes(StandardCharsets.ISO_8859_1)
                        , StandardCharsets.UTF_8);
                // 付款金额
                String total_amount = new String(
                        request.getParameter("total_amount").getBytes(StandardCharsets.ISO_8859_1)
                        , StandardCharsets.UTF_8);

                // 修改订单号的状态
                request.setAttribute("reuslt", "trade_no:" + trade_no + "<br/>out_trade_no:" + out_trade_no
                        + "<br/>total_amount:" + total_amount);
            } else {
                request.setAttribute("reuslt", "支付失败");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        request.getRequestDispatcher("/successs.jsp").forward(request, response);
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }
}
